/**
 * @description 创建层级关系树，对原数组进行更改，为节点添加id、parentId、pathList(关系顺序链)属性
 * @param tree 需要创建层级关系的树
 * @param field 可选, 如果传入, 则会在每个节点的 field 属性上添加 id、parentId、pathList 属性
 * @param pathList 逐层id组成的数组, 可通过length判断层数, 以及获取祖先id
 * @returns 创建层级关系后的树, 但不一定能访问 id、parentId、pathList 属性
 */
export const buildHierarchyTree = <T>(tree: any[], field: string | null = null, pathList: string[] = []): T[] => {
    if (!Array.isArray(tree)) {
        console.warn("tree must be an array");
        return [];
    }
    if (!tree || tree.length === 0) return [];
    for (const [key, node] of tree.entries()) {
        if (!field) {
            node.id = node.id || `${key}`; // 设置数组下标为id
            node.parentId = pathList.length ? pathList[pathList.length - 1] : null;
            node.pathList = [...pathList, node.id]; // 父级id组成的数组
        } else {
            node[field].id = node.id || `${key}`;
            node[field].parentId = pathList.length ? pathList[pathList.length - 1] : null;
            node[field].pathList = [...pathList, node[field].id];
        }
        if (node.children && node.children.length > 0) {
            buildHierarchyTree(node.children, field, node.pathList || node[field!].pathList);
        }
    }
    return tree;
};
